package www.lagou.dao;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import www.lagou.entity.Phone;
import www.lagou.utils.DruidUtils;

import java.sql.SQLException;
import java.util.List;

/**
 * 查询指定类型的手机信息。
 */
public class PhoneQuery {
    // 用到的 SQL 语句。
    private static final String SQL_GET_PHONE_BY_PRICE_DATE = "SELECT id, pname, price, prodate, color FROM phone WHERE price >= ? AND prodate < ?";
    private static final String SQL_GET_PHONE_BY_COLOR = "SELECT id, pname, price, prodate, color FROM phone WHERE color = ?";

    /**
     * 查询指定年限前，大于某个价位的全部手机。
     *
     * @param leastPrice 最低价格。
     * @param yearBefore 最大年限。
     * @return 手机信息列表。
     * @throws SQLException 数据库查询异常。
     * @throws IllegalArgumentException 价格不是有效的浮点数，或年限超出范围。
     */
    public static List<Phone> getPhoneByPriceDate(double leastPrice, int yearBefore) throws SQLException {
        if (!Double.isFinite(leastPrice) || yearBefore < 0 || yearBefore > 9999) {
            throw new IllegalArgumentException();
        }

        QueryRunner runner = new QueryRunner(DruidUtils.getDataSource());
        return runner.query(SQL_GET_PHONE_BY_PRICE_DATE, new BeanListHandler<>(Phone.class),
                leastPrice, Integer.toString(yearBefore));
    }

    /**
     * 查询指定颜色的所有手机。
     *
     * @param color 手机颜色。
     * @return 手机信息列表。
     * @throws SQLException 数据库查询异常。
     * @throws NullPointerException 手机颜色为 null。
     */
    public static List<Phone> getPhoneByColor(String color) throws SQLException {
        if (color == null) {
            throw new NullPointerException();
        }

        QueryRunner runner = new QueryRunner(DruidUtils.getDataSource());
        return runner.query(SQL_GET_PHONE_BY_COLOR, new BeanListHandler<>(Phone.class), color);
    }
}
